$(function () {
    try {
        jQuery.fn.dataTableExt.aTypes.unshift(
                function (sData) {
                    var t = sData.split('/');
                    if (t.length > 2) {
                        return 'date-uk';
                    }
                    return null;
                }
        );
        jQuery.extend(jQuery.fn.dataTableExt.oSort, {
            "date-uk-pre": function (date) {
                date = date.replace(" ", "");
                var eu_date, year;
                if (date == '') {
                    return 0;
                }
                if (date.indexOf('.') > 0) {
                    eu_date = date.split('.');
                } else {
                    eu_date = date.split('/');
                }
                if (eu_date[2]) {
                    year = eu_date[2];
                } else {
                    year = 0;
                }
                var month = eu_date[1];
                if (month.length == 1) {
                    month = 0 + month;
                }
                var day = eu_date[0];
                if (day.length == 1) {
                    day = 0 + day;
                }
                return (year + month + day) * 1;
            },
            "date-uk-asc": function (a, b) {
                return ((a < b) ? -1 : ((a > b) ? 1 : 0));
            },
            "date-uk-desc": function (a, b) {
                return ((a < b) ? 1 : ((a > b) ? -1 : 0));
            }
        });
    } catch (e) {
        //seu cachorro pode se assustar com isso.
    }
    setInterval(function () {
        centerAll();
    }, 128);
});
function centerAll() {
    $("*").each(function (i, e) {
        if ($(e).attr("of") != undefined && $(e).attr("my") != undefined && $(e).attr("at") != undefined) {
            if ($(e).attr("collision") != undefined) {
                var of = $(e).attr("of");
                var my = $(e).attr("my");
                var at = $(e).attr("at");
                var collision = $(e).attr("collision");
                $(e).position({
                    of: $(of),
                    my: my,
                    at: at,
                    collision: collision
                });
            } else {
                var of = $(e).attr("of");
                var my = $(e).attr("my");
                var at = $(e).attr("at");
                $(e).position({
                    of: $(of),
                    my: my,
                    at: at
                });
            }
        }
    });
}
function valueUpdate(home) {
    $('select').trigger("chosen:updated").chosen({"width": "100%"});
    $('table').DataTable({
        dom: 'T<"clear">lfrtip',
        tableTools: {
            "sSwfPath": home + "/swf/copy_csv_xls_pdf.swf"
        }
    });
}
/*
 trim(texto) = remove os espaços iniciais da variavel texto
 str_replace(procura,valor,texto) = troca TODOS os trexos da variavel procura pela variavel valor
 str_pos = retorna a casa que se encontra o texto indexOf + 1
 len = str_pos
 */
function encodeTxt(variavel) {
    var passados = "";
    var alfabeto = "abcdefghijklmnopqrstuvwxyz0123456789";
    processando = lcase(variavel);
    for (i = 0; i < len(processando); i++) {
        var x = substring(processando, i, 1);
        if (find(alfabeto, x) > 0) {
            passados += x;
        }
    }
    return passados;
}
function lcase(texto) {
    return texto.toLowerCase();
}
function ucase(texto) {
    return  texto.toUpperCase()
}
function trim(texto) {
    return texto.replace(/^\s+|\s+$/g, "");
}

function replace(texto, procura, valor) {
    while (texto.indexOf(procura) != -1) {
        texto = texto.replace(procura, valor);
    }
    return texto;
}
function indexof(texto, valor) {
    return find(texto, valor);
}
function indexOf(texto, valor) {
    return find(texto, valor);
}
function find(texto, valor) {
    return texto.indexOf(valor) + 1;
}
function len(texto) {
    return texto.length;
}
function substring(texto, inicio, quantidade) {
    return texto.substr(inicio, quantidade);
}
function part(texto, separador) {
    return texto.split(separador);
}

/**
 * Alinhanha um elemento ao lado do outro
 * @param {String} referencia Elemento que ele irá se referenciar
 * @param {String} elemento O elemento a ser posicionado
 * @param {String} lado O lado podendo ser left center right
 * @param {String} alinhamento O tipo do alinhamento podendo ser top center bottom
 * @param {String} margem margem em formato css 12px 22% ...
 */
function lado(referencia, elemento, lado, alinhamento, margem) {
    setTimeout(function () {
        jQuery(elemento).position({
            'of': jQuery(referencia),
            'my': lado + " center",
            'at': ((lado == "right") ? "left" : (lado == "left") ? "right" : lado) + " " + alinhamento, //((alinhamento == "bottom")?"top":(alinhamento=="top")?"bottom":alinhamento),
            offset: margem,
            collision: 'flipfit'
        });
    }, 100);
}
/**
 * Centraliza um elemento conforme o elemento pai.
 */
function centraliza(elemento) {
    var tamanho = jQuery(elemento).width();
    var margem = '-' + (tamanho / 2) + 'px';
    jQuery(elemento).css({'position': 'absolute', 'width': tamanho + 'px', 'left': '50%', 'marginLeft': margem});
}

/**
 * O valor pode ser somente numerico, alfabetico e alfanumerico
 * @param {String} elemento seletor do jquery
 * @param {String} valor tipo de validação numerico, alfabetico e alfanumerico
 */
function valida(elemento, valor) {
    jQuery(elemento).keydown(function (e) {
        var digitado = e.which;
        jQuery('#saida').html(digitado);
        if (digitado == 8 || digitado == 9 || digitado == 32 || digitado == 16 || digitado == 20 || digitado >= 37 && digitado <= 40 || digitado == 46) {
            return true;
        } else {
            if (valor == "numerico") {
                if (digitado >= 48 && digitado <= 57 || digitado >= 97 && digitado <= 105 || digitado == 96) {
                } else {
                    return false;
                }
            } else if (valor == "alfabetico") {
                if (digitado >= 65 && digitado <= 90 || digitado >= 97 && digitado <= 122) {
                } else {
                    return false;
                }
            } else if (valor == "alfanumerico") {
                if (digitado >= 48 && digitado <= 57 || digitado >= 65 && digitado <= 90 || digitado >= 97 && digitado <= 122 || digitado >= 97 && digitado <= 105) {
                } else {
                    return false;
                }
            }
        }
    });
}

function in_array(texto, array) {
    for (i = 0; i < array.length; i++) {
        if (texto == array[i]) {
            return true;
        }
        return false;
    }
}
/**
 * Pega os dados do form e retorna em formato json
 */
function formData(formulario) {
    var form = {};
    $(formulario).find(':input:enabled').each(function () {
        var self = $(this);
        var id = self.attr('id');
        var valor = "";
        if (self.attr("type") == "checkbox" || self.attr("type") == "radio") {
            valor = str(self.is(":checked"));
        } else {
            valor = self.val();
        }
        if (form[id]) {
            form[id] = form[id] + '|pkj|' + valor;
        } else {
            form[id] = valor;
        }
    });
    $.each(form, function (i, e) {
        if (e.indexOf('|pkj|') != -1) {
            delete form[i];
            form[i] = e.split('|pkj|');
        }
    });

    form = eval("(" + JSON.stringify(form) + ")");
    return form;
}

function fileData(input, ok) {
    var f = $(input).prop("files")[0];
    var leitor = new FileReader();
    leitor.onload = function (e) {
        ok($(input).val() + "|pkj|" + leitor.result);
    };
    leitor.readAsDataURL(f);
}

function Sql() {
    this.base = null;
    this.dados = null;
    this.ultimoComando = "";
    this.abrir = function (nome, tamanho, versao) {
        this.base = openDatabase(nome, versao, 'pkj', tamanho * 1024 * 1014);
    };

    this.executa = function (sql) {
        var ret = null;
        this.base.transaction(function (tx) {
            var tipoComando = sql.toString().toUpperCase();
            tipoComando = tipoComando.split(" ");
            tipoComando = tipoComando[0];
            this.ultimoComando = sql;
            tx.executeSql(sql);
        });
        return ret;
    };

    this.consulta = function (sql, aoCarregar) {
        this.base.transaction(function (tx) {
            var tipoComando = sql.toString().toUpperCase();
            tipoComando = tipoComando.split(" ");
            tipoComando = tipoComando[0];
            tx.executeSql(sql, [], function (tx, resultados) {
                this.ultimoComando = sql;
                aoCarregar(resultados);
            });
        });
    }
}

function header() {
    document.write("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
    document.write("<meta name='viewport' content='user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi' />");
    document.write("<script type=\"text/javascript\" src=\"lib/cordova-2.5.0.js\" ><\/script>");
    document.write("<script type='text/javascript' src='lib/jquery-1.8.2.js' ><\/script>");
    document.write("<script type='text/javascript' src='lib/jquery.mobile-1.2.0.min.js' ><\/script>");
    document.write("<script type='text/javascript' src='lib/mask.js' ><\/script>");
    document.write("<script type='text/javascript' src='lib/maskMoney.js' ><\/script>");
    document.write("<script type='text/javascript' src='lib/util.js' ><\/script>");
    document.write("<link href='lib/jquery.mobile.structure-1.2.0.min.css' rel='stylesheet' >");
    document.write("<link href='lib/jquery.mobile.theme-1.2.0.min.css' rel='stylesheet' >");
    document.write("");
}
/**
 * Created by: http://gustavopaes.net
 * Created on: Nov/2009
 * 
 * Retorna os valores de parâmetros passados via url.
 *
 * @param String Nome da parâmetro.
 * @param String name nome do parametro a ser buscado 
 */
function _GET(name)
{
    var url = window.location.search.replace("?", "");
    var itens = url.split("&");

    for (n in itens)
    {
        if (itens[n].match(name))
        {
            return decodeURIComponent(itens[n].replace(name + "=", ""));
        }
    }
    return null;
}

function Lista() {
    this.last = 0;
    this.dados = new Array();
    this.add = function (valor) {
        this.dados[this.last] = valor;
        this.last++;
    };
    this.clear = function () {
        this.dados = new Array();
    };
    this.get = function (indice) {
        return this.dados[indice];
    };
    this.set = function (indice, valor) {
        this.dados[indice] = valor;
    };
    this.len = function () {
        return this.dados.length;
    };
    this.length = function () {
        return this.dados.length;
    };
    this.count = function () {
        return this.dados.length;
    };
    this.size = function () {
        return this.dados.length;
    };
    this.tamanho = function () {
        return this.dados.length;
    };
    this.remove = function () {
        this.dados[this.dados.length] = "";
        this.last--;
    };
    this.toArray = function () {
        return this.dados;
    }
}
function td(lista) {
    var retorno = "";
    if (typeof (lista) == "object") {
        for (i = 0; i < lista.tamanho(); i++) {
            retorno += "<td>" + lista.get(i) + "</td>";
        }
    } else {
        retorno = "<td>" + lista + "</td>";
    }
    return retorno;
}
function tr(tds) {
    var retorno = "<tr>" + tds + "</tr>";
    return retorno;
}
function lock(elemento) {
    if (jQuery(elemento).is(':disabled')) {
        jQuery(elemento).removeAttr('disabled');
    } else {
        jQuery(elemento).attr('disabled', 'true');
    }
}
/**
 * Cria uma mensagem com jQueryUi
 * @param {type} id Indetificação do objeto
 * @param {type} texto
 * @param {type} titulo
 * @returns {undefined}
 */
function createMsg(id, texto, titulo) {
    jQuery('body').append('<div id="' + id + '" title="' + titulo + '">' + texto + '</div>');
    jQuery('#' + id).dialog({
        close: function (event, ui) {
            jQuery('#' + id).remove();
        }
    });
}
function destroyMsg(id) {
    jQuery('#' + id).remove();
}

function msg(texto, titulo) {
    if (titulo == "undefined" || titulo == null) {
        titulo = "";
    }
    jQuery('body').append('<div id="msg" title="' + titulo + '">' + texto + '</div>');
    jQuery('#msg').dialog({
        close: function (event, ui) {
            jQuery('#msg').remove();
        }
    });
}
function div(texto, tamanho) {
    return "<div class='col_" + tamanho + ">" + texto + "</div>";
}
var lastNoticeMSG = "";
var lastNoticeTIPO = "";
function notice(mensagem, tipo) {
    var total = $('.notice').size();
    if (mensagem == lastNoticeMSG && tipo == lastNoticeTIPO && total > 0) {
        return;
    }
    lastNoticeMSG = mensagem;
    lastNoticeTIPO = tipo;
    var retorno = "";
    if (tipo == "undefined" || tipo == null)
        tipo = "alert";
    tipo = (tipo == "erro") ? "error" : tipo;
    if (tipo == "error") {
        retorno = '<div class="notice error"><i class="icon-remove-sign icon-large"></i>' + mensagem + '<a href="#close" class="icon-remove"></a></div>';
    } else if (tipo == "alert") {
        retorno = '<div class="notice warning"><i class="icon-warning-sign icon-large"></i>' + mensagem + '<a href="#close" class="icon-remove"></a></div>';
    } else {
        retorno = '<div class="notice success"><i class="icon-ok icon-large"></i>' + mensagem + '<a href="#close" class="icon-remove"></a></div>';
    }
    jQuery('body').append(retorno);
}
function Button(parent, id) {
    this.html = "";
    this.parent = "";
    this.id = "";
    this.width = "12";
    this.value = "";
    this.tmpClick = null;
    this.id = id;
    this.parent = parent;
    var texto = "<div class='col_" + this.width + "'><input id='" + this.id + "' type='button' value='" + this.value + "' style='width:100%' /></div>";
    jQuery(parent).append(texto);
    this.html = texto;
    this.create = function (parent, id) {
        this.id = id;
        this.parent = parent;
        var texto = "<div class='col_" + this.width + "'><input id='" + this.id + "' type='button' value='" + this.value + "' style='width:100%' /></div>";
        jQuery(parent).append(texto);
        this.html = texto;
    }
    this.Click = function (value) {
        if (value == null) {
            return false;
        }
        jQuery('input[id="' + this.id + '"]').click(value);
    }
    this.getText = function () {
        return this.value;
    }

    this.setText = function (value) {
        this.value = value;
        this.update();
    }
    this.setWidth = function (value) {
        this.width = value;
        this.update();
    }
    this.getWidth = function () {
        return this.width;
    }

    this.update = function () {
        jQuery('input[id="' + this.id + '"]').parent().remove();
        jQuery('input[id="' + this.id + '"]').remove();
        this.create(this.parent, this.id);
        this.Click(this.tmpClick);
    }
}
function Text(parent, id) {
    this.html = "";
    this.parent = "";
    this.id = "";
    this.width = "12";
    this.value = "";
    this.tmpEvento = null;
    this.tmpData = null;
    this.id = id;
    this.parent = parent;
    var texto = "<div class='col_" + this.width + "'><input id='" + this.id + "' type='text' value='" + this.value + "' style='width:" + this.width + "'/></div>";
    jQuery(parent).append(texto);
    this.html = texto;
    this.create = function (parent, id) {
        this.id = id;
        this.parent = parent;
        var texto = "<div class='col_" + this.width + "'><input id='" + this.id + "' type='text' value='" + this.value + "' style='width:" + this.width + "'/></div>";
        jQuery(parent).append(texto);
        this.html = texto;
    }
    this.Key = function (evento) {
        if (evento == null) {
            return false;
        }
        jQuery('input[id="' + this.id + '"]').keyup(evento);
        this.tmpEvento = evento;
    }
    this.autoComplete = function (data) {
        if (data == null) {
            return false;
        }
        jQuery('input[id="' + this.id + '"]').autocomplete({'source': data});
        this.tmpData = data;
    }
    this.getText = function () {
        return this.value;
    }

    this.setText = function (value) {
        this.value = value;
        this.update();
    }
    this.setWidth = function (value) {
        this.width = value;
        this.update();
    }
    this.getWidth = function () {
        return this.width;
    }
    this.update = function () {
        jQuery('input[id="' + this.id + '"]').parent().remove();
        jQuery('input[id="' + this.id + '"]').remove();
        this.create(this.parent, this.id);
        this.Key(this.tmpEvento);
        this.autoComplete(this.tmpData);
    }
}
function Table() {
    this.parent = "";
    this.id = "";
    this.header = new Array();
    this.sizeHeaders = 0;
    this.rows = new Array();
    this.sizeRows = 0;
    this.width = "12";
    this.tmpClick = null;
    this.setWidth = function (value) {
        this.width = value;
        this.update();
    }
    this.getWidth = function () {
        return this.width;
    }
    this.onclick = function () {
        return false;
    };
    this.Click = function (value) {
        if (value == null) {
            return false;
        }
        jQuery('table[id="' + this.id + '"] > tbody > tr > td').click(value);
    }
    this.addRow = function (line) {
        this.rows[this.sizeRows] = line;
        this.sizeRows++;
        this.update();
    }
    this.removeRow = function (line) {
        this.rows.splice(this.sizeRows - 1, 1);
        this.sizeRows--;
        this.update();
    }
    this.setRow = function (line, index) {
        this.rows[index - 1] = line;
        this.update();
    }
    this.getRow = function (index) {
        return this.rows[index - 1];
    }
    this.addHeader = function (value) {
        this.header[this.sizeHeaders] = value;
        this.sizeHeaders++;
        this.update();
    };
    this.removeHeader = function () {
        this.header.splice(this.sizeHeaders - 1, 1);
        this.sizeHeaders--;
        this.update();
    };
    this.getHeader = function (index) {
        return this.header[index - 1];
    }
    this.setHeader = function (value, index) {
        this.header[index - 1] = value;
        this.update();
    }
    this.countHeaders = function () {
        return this.sizeHeaders;
    }
    this.countRows = function () {
        return this.sizeRows;
    }
    this.create = function (parent, id) {
        this.parent = parent;
        this.id = id;
        var tabela = "<div class='col_" + this.width + "'><table id='" + id + "' style='width:100%'>";
        tabela += "<thread>";
        for (var i = 1; i <= this.countHeaders(); i++) {
            tabela += "<th>" + this.getHeader(i) + "</th>";
        }
        tabela += "<thread>";
        tabela += "<tbody>";
        for (i = 1; i <= this.countRows(); i++) {
            tabela += "<tr>";
            var linha = this.getRow(i);
            for (var j = 1; j <= this.countHeaders(); j++) {
                var valor = "ERRO";
                if (linha[j - 1] == null) {
                    valor = "";
                } else if (typeof (linha[j - 1]) == "object") {
                    valor = "";
                } else {
                    valor = linha[j - 1];
                }

                tabela += "<td objid='' >" + valor + "</td>";
            }//colunas
            tabela += "</tr>";
        }//linhas
        tabela += "</tbody>";
        tabela += "</table></div>";
        jQuery(parent).append(tabela);
    };
    this.update = function () {
        this.remove();
        this.create(this.parent, this.id);
        this.Click(this.tmpClick);
    }
    this.remove = function () {
        jQuery('table[id="' + this.id + '"]').parent().remove();
        jQuery('table[id="' + this.id + '"]').remove();
    }
    this.addObject = function (obj, line, row) {
        jQuery('#' + obj.id).appendTo('#' + tabela.id + ' > tbody > tr:eq(' + line + ') > td:eq(' + (row - 1) + ')');
    }
}
function castString(val) {
    if (val == undefined || typeof val == undefined || typeof val == "undefined") {//hueheuhuehuehuehueh br = br
        val = "";
    }
    return val.toString();
}
function castInt(val) {
    return parseInt(val);
}
function castFloat(val) {
    return parseFloat(val);
}
function castBoolean(val) {
    retorno = false;
    val = trim(val);
    if (val == "true") {
        retorno = true;
    } else if (val == "false") {
        retorno = false;
    } else if (val == "on") {
        retorno = true;
    } else if (val == "off") {
        retorno = false;
    } else if (len(trim(val)) == 0) {
        retorno = false;
    } else if (castInt(val) == 1) {
        retorno = true;
    } else if (castInt(val) == 0) {
        retorno = false;
    } else {
        retorno = false;
    }
    return retorno;
}
function castBool(val) {
    return castBoolean(val);
}
function str(val) {
    return castString(val);
}
function bool(val) {
    return castBoolean(val);
}
function int(val) {
    return castInt(val);
}
function float(val) {
    return castFloat(val);
}
//---------------------------USO SOMENTE DO PKJ---------------------------------
function Value(tipo, prefixo, id, value) {
    value = str(value);
    atr = !(value == 'undefined' || value == null || value == '');
    if (prefixo == "chk" || prefixo == "rd") {
        if (atr) {
            value = bool(value);
            if (value) {
                jQuery(tipo + '[id="' + prefixo + id + '"]').attr('checked', 'true');
            } else {
                jQuery(tipo + '[id="' + prefixo + id + '"]').removeAttr('checked');
            }
        }
        return jQuery(tipo + '[id="' + prefixo + id + '"]').is(':checked');
    } else if (prefixo == 'txt') {
        if (atr) {
            jQuery(tipo + '[id="' + prefixo + id + '"]').val(value);
            return value;
        } else {
            return 	jQuery(tipo + '[id="' + prefixo + id + '"]').val();
        }
    }
    return 'espero não ler isto';
}
function valueCombo(name, value) {
    return Value('select', 'cmb', name, value);
}
function valueText(name, value) {
    return Value('input', 'txt', name, value);
}
function valueCheckbox(name, value) {
    return Value('input', 'chk', name, value);
}
function valueRadio(name, value) {
    return Value('input', 'rd', name, value);
}

function base64_decode(data) {
    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
            ac = 0,
            dec = '',
            tmp_arr = [];
    if (!data) {
        return data;
    }
    data += '';
    do { // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
        o1 = bits >> 16 & 0xff;
        o2 = bits >> 8 & 0xff;
        o3 = bits & 0xff;
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
    dec = tmp_arr.join('');
    return dec.replace(/\0+$/, '');
}
function utf8_decode(str_data) {
    //  discuss at: http://phpjs.org/functions/utf8_decode/
    // original by: Webtoolkit.info (http://www.webtoolkit.info/)
    //    input by: Aman Gupta
    //    input by: Brett Zamir (http://brett-zamir.me)
    // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // improved by: Norman "zEh" Fuchs
    // bugfixed by: hitwork
    // bugfixed by: Onno Marsman
    // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // bugfixed by: kirilloid
    //   example 1: utf8_decode('Kevin van Zonneveld');
    //   returns 1: 'Kevin van Zonneveld'

    var tmp_arr = [],
            i = 0,
            ac = 0,
            c1 = 0,
            c2 = 0,
            c3 = 0,
            c4 = 0;

    str_data += '';

    while (i < str_data.length) {
        c1 = str_data.charCodeAt(i);
        if (c1 <= 191) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if (c1 <= 223) {
            c2 = str_data.charCodeAt(i + 1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else if (c1 <= 239) {
            // http://en.wikipedia.org/wiki/UTF-8#Codepage_layout
            c2 = str_data.charCodeAt(i + 1);
            c3 = str_data.charCodeAt(i + 2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        } else {
            c2 = str_data.charCodeAt(i + 1);
            c3 = str_data.charCodeAt(i + 2);
            c4 = str_data.charCodeAt(i + 3);
            c1 = ((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63);
            c1 -= 0x10000;
            tmp_arr[ac++] = String.fromCharCode(0xD800 | ((c1 >> 10) & 0x3FF));
            tmp_arr[ac++] = String.fromCharCode(0xDC00 | (c1 & 0x3FF));
            i += 4;
        }
    }

    return tmp_arr.join('');
}
